/**
 * @author: Gene
 * @age: 永远18岁的美少年
 * @Email： yangjianyun@58.com
 * @date: 2021-11-25 22:12:02
 * @description: babel 的插件应该是一个函数, 函数返回一个对象
 */
// babel 的核心模块
const core = require("@babel/core")
//用来生成或判断节点的 AST 语法树的节点
let types = require("@babel/types")

const visitor = {
    ImportDeclaration(path, state) {
        const {node} = path // 获取节点
        const {specifiers} = node // 获取批量导入声明数组
        // 插件传的 options
        const {libraryName} = state.opts // 获取选项中的支持的库的名称
        // 如果当前节点的模块名称 是我们需要的库的名称,
        if (node.source.value === libraryName) {
            // 遍历批量导入声明的数组
            const declarations = specifiers.map((specifier) => {
                // 返回一个 importDeclaration 节点
                return types.importDeclaration(
                    [types.importDefaultSpecifier(specifier.local)],
                    types.stringLiteral(`${libraryName}/${specifier.imported.name}`)
                )
            })
            // 用新节点,替换老节点
            path.replaceWithMultiple(declarations)
        }
    }
}
module.exports = () => {
    return {
        visitor
    }
}